/*	--- 使用Future --- 


在执行多个任务的时候，使用Java标准库提供的【线程池】是非常方便的。

我们提交的任务只需要实现Runnable接口，就可以让线程池去执行： */
class Task implements Runnable {
	public String result;

	public void run() { // Runnable接口 方法 必定 void
		this.result = longTimeCalculation();
	}
}


/*
Runnable接口有个问题，它的方法没有返回值。

如果任务需要一个返回结果，那么只能保存到变量，还要提供额外的方法读取，非常不便。

所以，Java标准库还提供了一个Callable接口，和Runnable接口比，它多了一个返回值：  */
class Task implements Callable<String> {
	public String call() throws Exception { // 能定义返回
		return longTimeCalculation();
	}
}


/*
并且Callable接口是一个泛型接口，可以返回指定类型的结果。


----------------------------------------------


Q: 现在的问题是，如何获得异步执行的结果？

如果仔细看ExecutorService.submit()方法，可以看到，它返回了1个Future类型

一个Future类型的实例 代表 1个未来能获取结果的对象： */
ExecutorService executor = Executors.newFixedThreadPool(4);

// 定义任务:
Callable<String> task = new Task(); // 上转型为Callable

// 提交任务并获得Future:
Future<String> future = executor.submit(task); 
	// Future与task同类型

// 从Future中, 获取synchronize execute返回的result: 
String result = future.get(); // 可能阻塞


/*
一个Future<V>接口表示一个未来可能会返回的结果，它定义的方法有：

	· get()：获取结果（可能会等待）

	· get(long timeout, TimeUnit unit): 
		获取结果，但只等待指定的时间;

	· cancel(boolean mayInterruptIfRunning)：取消当前任务;

	· isDone()：判断任务是否已完成。


*/



/*-------------------------------------------

#	---- 使用Future の 小结 ---- 

1. 对线程池提交一个Callable任务，可以获得一个Future对象；

2. 可以用Future在将来某个时刻获取结果。


*/












